package com.bgs.travelapp.fileManager.service.impl;


import com.bgs.travelapp.config.ScenicConfigProperties;
import com.bgs.travelapp.fileManager.entity.FileManagerEntity;
import com.bgs.travelapp.fileManager.mapper.FileManagerMapper;
import com.bgs.travelapp.fileManager.service.FileManagerService;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartRequest;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

@Service
public class FileManagerServiceImpl implements FileManagerService {
    @Resource
    FileManagerMapper fileManagerMapper;

    @Resource
    ScenicConfigProperties scenicConfigProperties;

    /**
     * 批量图片上传到数据库
     * @param file
     * @return
     */
    @Override
    public Integer uploadPicture(MultipartFile file) {
        String fileName = file.getOriginalFilename(); // // 获取上传图片/文件名称
        String suffix = fileName.substring(fileName.indexOf("."));  // 获取上传图片/文件的后缀名
        //简单的时间格式化   simple(简单)  Date(时间)   format(格式化)
        Date d = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//yyyy 年   MM 月   dd 天
        String format = df.format(d);

        long size = file.getSize();//获取上传图片/文件的大小
        String fileFullPath = "";//用于存放附件路径
        FileManagerEntity fileManagerEntity = new FileManagerEntity();//判断附件类型
        String rootPath = scenicConfigProperties.getRootPath();// 获取图片/文件跟路径
        String fileImagePath = ""; // 图片或附件的路径
        String mPath = "";// 中间路径
        if(scenicConfigProperties.getImageType().contains(suffix)){ //根据后缀名进行判断
            long imageSize = scenicConfigProperties.getImageMaxSize() * 1024*1024; //获取上传的限制
            fileImagePath = scenicConfigProperties.getImagePath();    //获取上传的路径
            if(size>0&&size<=imageSize){   // 校验附件大小
                mPath = fileImagePath+format;
            }else{
                System.out.println("图片大小不能等于0并且不能大于2mb");
                return 0;
            }
        }else if(scenicConfigProperties.getFileType().contains(suffix)) { //根据后缀名进行判断
            long fileSize = scenicConfigProperties.getFileMaxSize() * 1024*1024;  //获取上传的限制
            fileImagePath = scenicConfigProperties.getFilePath(); //获取上传的路径
            if(size>0&&size<=fileSize){  // 校验附件大小
                mPath = fileImagePath+format;   //中间路径
            }else{
                System.out.println("文件大小不能等于0并且不能大于10mb");
                return 0;
            }
        }else{
            System.out.println("不支持文件格式");
            return 0;
        }
        UUID uuid = UUID.randomUUID();
        String fsn = uuid+suffix;// 加密文件名称
        // 数据放入文件实体对象
        fileManagerEntity.setDel_flag(1);               //逻辑删除
        fileManagerEntity.setCreateTime(new Date());    //创建时间
        fileManagerEntity.setUpdateTime(new Date());    //更新时间
        fileManagerEntity.setFileName(fileName);        //上传的名称
        fileManagerEntity.setFileSize(size);            //上传的大小
        fileManagerEntity.setFileSuffix(suffix);        //上传的后缀名
        fileManagerEntity.setFilePath(mPath);           //中间路径
        fileManagerEntity.setFileEncryptionName(fsn);   //加密后的文件名称
        Integer flag = fileManagerMapper.saveFile(fileManagerEntity);
        if(fileManagerEntity.getId()>0){ //根据mapper返回的结果判断是否大于0
            fileFullPath = rootPath+mPath+ File.separator+fsn;   // 文件绝对路径
            try {
                File newFile = new File(fileFullPath); // 文件存放路径
                if(!newFile.getParentFile().exists()){  //判断是否有缺少的文件路径
                    newFile.getParentFile().mkdirs(); //如果父级目录不存在则创建所有文件夹
                }
                file.transferTo(newFile);   //transferTo方法保存文件
            } catch (IOException e) {
                e.printStackTrace();
            }
        }else{
            return 0;
        }
        return fileManagerEntity.getId();
    }

    /**
     * 根据图片id下载图片
     * @param response
     * @param id
     */
    @Override
    public void getImageById(HttpServletResponse response, Integer id) {
        FileManagerEntity scenicPritureEntity = fileManagerMapper.getScenicPritureEntityById(id);// 获取实体对选哪个
        if(scenicPritureEntity!=null){    //根据返回的实体类是否为空进行判断
            String fullPath = scenicConfigProperties.getRootPath()+scenicPritureEntity.getFilePath()+File.separator+scenicPritureEntity.getFileEncryptionName();  // 获取图片的全路径
            FileInputStream fileInputStream = null;// 创建FileInputStream文件输入流
            OutputStream outputStream = null;   //创建OutputStream文件输出流
            try {
                File file = new File(fullPath);//创建file对象
                fileInputStream = new FileInputStream(file);
                byte[] data = new byte[(int) file.length()]; // 创建byte字节数据
                fileInputStream.read(data); // 将文件流读取到data字节数据当中
                outputStream = response.getOutputStream();  // 获取输出流
                response.setContentType("image/png;charset=utf-8");// 设置响应格式
                outputStream.write(data); // 将字节数据写入到输出流当中
                outputStream.flush();  // 清空缓存
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally { //关闭连接
                try {
                    fileInputStream.close();
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }
    }

    /**
     * 游记封面图片上传
     * hbx 2022年8月4日09:43:02
     * @param multipartRequest
     * @return
     */
    @Override
    public Integer uploadReicText(MultipartRequest multipartRequest) {
        MultipartFile file = multipartRequest.getFile("file");
        String fileName = file.getOriginalFilename(); // // 获取上传图片/文件名称
        String suffix = fileName.substring(fileName.indexOf("."));  // 获取上传图片/文件的后缀名
        //简单的时间格式化   simple(简单)  Date(时间)   format(格式化)
        Date d = new Date();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//yyyy 年   MM 月   dd 天
        String format = df.format(d);

        long size = file.getSize();//获取上传图片/文件的大小
        String fileFullPath = "";//用于存放附件路径
        FileManagerEntity fileManagerEntity = new FileManagerEntity();//判断附件类型
        String rootPath = scenicConfigProperties.getRootPath();// 获取图片/文件跟路径
        String fileImagePath = ""; // 图片或附件的路径
        String mPath = "";// 中间路径
        if(scenicConfigProperties.getImageType().contains(suffix)){ //根据后缀名进行判断
            long imageSize = scenicConfigProperties.getImageMaxSize() * 1024*1024; //获取上传的限制
            fileImagePath = scenicConfigProperties.getImagePath();    //获取上传的路径
            if(size>0&&size<=imageSize){   // 校验附件大小
                mPath = fileImagePath+format;
            }else{
                System.out.println("图片大小不能等于0并且不能大于2mb");
                return 0;
            }
        }else if(scenicConfigProperties.getFileType().contains(suffix)) { //根据后缀名进行判断
            long fileSize = scenicConfigProperties.getFileMaxSize() * 1024*1024;  //获取上传的限制
            fileImagePath = scenicConfigProperties.getFilePath(); //获取上传的路径
            if(size>0&&size<=fileSize){  // 校验附件大小
                mPath = fileImagePath+format;   //中间路径
            }else{
                System.out.println("文件大小不能等于0并且不能大于10mb");
                return 0;
            }
        }else{
            System.out.println("不支持文件格式");
            return 0;
        }
        UUID uuid = UUID.randomUUID();
        String fsn = uuid+suffix;// 加密文件名称
        // 数据放入文件实体对象
        fileManagerEntity.setDel_flag(1);               //逻辑删除
        fileManagerEntity.setCreateTime(new Date());    //创建时间
        fileManagerEntity.setUpdateTime(new Date());    //更新时间
        fileManagerEntity.setFileName(fileName);        //上传的名称
        fileManagerEntity.setFileSize(size);            //上传的大小
        fileManagerEntity.setFileSuffix(suffix);        //上传的后缀名
        fileManagerEntity.setFilePath(mPath);           //中间路径
        fileManagerEntity.setFileEncryptionName(fsn);   //加密后的文件名称
        Integer flag = fileManagerMapper.saveTextFile(fileManagerEntity);
        if(fileManagerEntity.getId()>0){ //根据mapper返回的结果判断是否大于0
            fileFullPath = rootPath+mPath+ File.separator+fsn;   // 文件绝对路径
            try {
                File newFile = new File(fileFullPath); // 文件存放路径
                if(!newFile.getParentFile().exists()){  //判断是否有缺少的文件路径
                    newFile.getParentFile().mkdirs(); //如果父级目录不存在则创建所有文件夹
                }
                file.transferTo(newFile);   //transferTo方法保存文件
            } catch (IOException e) {
                e.printStackTrace();
            }
        }else{
            return 0;
        }
        return fileManagerEntity.getId();
    }


}
